<?php

//Cette classe est la classe mère de l'enemble des entités représentées dans la base
//de données. Elle apporte des fonctionnalités telles que le chargement d'une entité
//par son ID, la persistance d'une nouvelle entité...
class Entity {
	
	
	//fonction permettant de charger une entitée grâce à son indentifiant.
	public static function load($id){
		$result = Database::loadElement(static::$sql_table, static::$sql_id, $id);
		return mysqli_fetch_object($result,get_called_class());
	}
	
	
	public static function getMeta($meta=''){
		$result=Database::getTableMeta(static::$sql_table);
		switch($meta){
			case 'comment': return Texte::toHtml($result['comment']);
		}
		return '';
	
	}
	
	
	public static function getPropertyMetas($property){
		$result=Database::getColumnMeta(static::$sql_table, $property);
		return array(
			'comment'=>Texte::toHtml($result['comment'])
		);
	}
	
	
	public static function getCommentaire($property=''){
		return Texte::toHtml(Database::getCommentaire(static::$sql_table, $property));
	}
	
	
	
	//fonction permettant de connaitre le nombre d'entitée pour une classe.
	public static function countAll(){
		return Database::countElements(static::$sql_table);
	}
	
	
	
	public static function loadAll(){
		return self::castResult(Database::loadTable(static::$sql_table));
	}
	
	
	
	public static function loadGroup($from, $to, $order=''){
		return self::castResult(Database::loadTable(static::$sql_table, $from, $to, $order));
	}
	
	
	
	public static function getPK(){
		return static::$sql_id;
	}
	
	
	
	public function getId(){
		$pk=self::getPK();
		return $this->$pk;
	}
	
	
	
	public function populate($values){
		foreach(get_object_vars($this) as $key => $notImportant){
			if(isset($values[$key])){
				$type=static::$champs[$key]['type'];
                
                if($type=='time'){
                    if(is_numeric($values[$key])){
                        $this->$key=$values[$key];
                    }
                    else{
                        $this->$key=Date::timeToMinutes($values[$key]);
                    }
                }
                elseif($values[$key]=='null' && $type!='text' && $type!='textarea'){
                    $this->$key=null;
                }
                else{
                    $this->$key=$values[$key];
                }
                    
			}
		}
	}
    
    
	public static function populateList($rows){
		$liste=array();
		foreach($rows as $row){
			$classe=get_called_class();
			$instance=new $classe();
			$instance->populate($row);
			$liste[]=$instance;
		}
		return $liste;
	}
	
	
	
	public function delete(){
	    $idVal=get_object_vars($this)[static::$sql_id];
	    return self::remove($idVal);
	}
	
	
	
	public static function remove($id){
	    return Database::delete(static::$sql_table,static::$sql_id,$id);
	}
	
	
	
	public static function truncate(){
	    return Database::truncate(static::$sql_table);
	}
	
	
	
	public function save(){
		$parametres=get_object_vars($this);
		if($parametres[static::$sql_id]==null){
			if(isset(static::$blockCreate)){
				Message::error('Cet élément ne peut pas être créé');
				return false;
			}
			else{
				unset($parametres[static::$sql_id]); //on retire l'id dans le cas d'un insert
				return Database::insert(static::$sql_table,$parametres);
			}
		}
		else{
			$idVal=$parametres[static::$sql_id];
			unset($parametres[static::$sql_id]); //on retire l'id dans le cas d'un update aussi
			return Database::update(static::$sql_table,$parametres,static::$sql_id,$idVal);
		}
	}
	
	
	
	private static function castResult($result){
	    $liste=array();
	    while($row=mysqli_fetch_assoc($result)){
            $classe=get_called_class();
            $entity=new $classe();
            $entity->populate($row);
		    $liste[]=$entity;
	    }
	    return $liste;
	}
	
	
	//appel de propriétés
	public function __get($name){
		// Si la référence existe, on la passe
		if (isset($this->$name)) {
			return $this->$name;
		}
		// Sinon, on a peut être à faire à un appel d'entité FK
		// Pour simplifier la navigation, on retourne une instance plutôt qu'un ID
		else{
			// Recherche de la demande dans la liste des entités FK.
			foreach(static::$champs as $property => $params){
				if(isset($params['entity']) && $params['entity']==$name){
					//si l'entité n'a pas encore été chargée
					if(!isset($params['instance'])){
						$classe=static::$champs[$property]['type'];
						$params['instance']=$classe::load($this->$property);
					}
					return $params['instance'];
				}
			}
		}
		return null;
    }


}



?>